<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // 正则表达式元字符：
    // 点字符(.)：匹配除空白符和大于0xFFFF之外的一个字符
    // 位置字符：^/$: 表示字符串开始/结尾的位置（一行内）
    // 选择符（|）：表示“或”关系
    console.log(/11|22/.test("2112")); // true, 匹配11或22
    // 需要反斜杠转义的，一共有12个字符：^、.、[、$、(、)、|、*、+、?、{和\
    // 正则表达式中的特殊含义的字符，若要匹配他们本身，就需要加上反斜杠（\）
    // 若使用构造函数生成的对象，则需要加上2个反斜杠（\\）
    console.log(/1\+1/.test("1+1")); // true
    console.log(new RegExp("1\\+1").test("1+1")); // true
    // 特殊字符： \cX（ctrl+X：x为26个字母之一），\r: 匹配回车，\0(U+0000): 匹配null字符
    // \xXX: 匹配2个16进制数，\uXXXX: 匹配4个16进制数
    // 方括号（[]）：任选括号里的任意一个字符
    // 若方括号内第一个字符为^,则表示除了括号内字符外，其他字符都可以匹配
    console.log(/[^abc]/.test("xyz")); // true

    // 若方括号内仅有一个^,则匹配一切字符
    console.log(/[^]/.test("\r")); // true
    // 方括号内字母/数字/unicode字符之间的连字符(-)表示一个范围，但其他地方-则表示普通字符
    console.log(/[\u0000-\uffff]*/.test("abc")); //true
    console.log(/[0-3021]/.test("9")); // false, 括号内匹配0-3中的一个或者一个1
    // 预定义：
    // \d: 匹配一个数字，\D: 匹配一个非数字
    // \w: 匹配字母/数字/下划线，\W: 匹配除字母/数字/下划线之外的字符
    // \s: 匹配空白字符（[\n\r\t\v\f]），\S: 匹配非空白字符
    // \b: 匹配单词边界，\B: 匹配非单词边界（在词的内部）            ?????????????????
    console.log(/\B/.test(""));
    // 大括号（{}）：匹配大括号内的次数
    // 贪婪符：最大匹配：?(0/1), *(0,n), +(1,n)
    // 非贪婪符（在贪婪符后加一个？号, 一旦条件满足，就不再往下匹配。
    // 最小匹配： ??(0), *?(0), +?(1次)

    // 修饰符：
    // g: 全局匹配，不加则每次匹配从头开始，加上每次匹配在上一次匹配后的lastIndex处开始匹配
    // i: 忽略大小写，不加则区分大小写
    // m: 多行匹配，用于^/$，不加则只匹配字符串开始和结尾（包括换行），加上表示换行符之前为一行，换行之后为一行
    console.log(/^x/m.test("abc\rxyz")); // true
    // 在同一个正则式中，使用\x(数字)引用括号里的内容
    // \1为第一个括号即(a),\2为第二个括号即(c(b)),\3为第三个括号即(b)
    console.log(/(a)(c(b))\3\2\1/.test("acbbcba")); // true
    // 非捕获组
    // (?:XXX): 不返回该组的组匹配，但是其他未设置的组照常返回
    console.log("abc".match(/(a)(?:b)(c)/)); //  ["abc", "a", "c"]，由于b设置了(?:XXX)，所以不返回b的值
    // 捕获网址：http://wangdoc.com/javascript/stdlib/regexp.html
    var reUrl = /^http(?:s)?:\/\/([^\/\s]+(\/)?)+/;
    var url = "https://cn.bing.com/dict/search";
    // ["https://cn.bing.com/dict/search", "search", undefined]
    // 数组第一个元素为整个re匹配的内容，第二个之后的元素为未设置(?:XXX)的组匹配内容
    // 依次为：([^\/\s]+(\/)?): "search",   (\/): undefined
    console.log(reUrl.exec(url));
    // X(?=Y): 只有在Y前的X才会被匹配，并且不返回括号的组匹配
    console.log("ba bw bu".match(/b(?=w)/g)); // ["b"], 只有在w前的b才匹配，并且只返回b
    // X(?!Y): 只有不在Y前的X才会被匹配，并且不返回括号的组匹配
    console.log("ba bw bu".match(/b(?!w)/g)); // ["b", "b"], 不返回括号的内容，比如a，u



</script>
</body>
</html>